; void generarFondo (Uint8 *fondo, Uint32 ancho_fondo, Uint32 alto_fondo, Uint32 primera_columna)

; constantes globales
%include "constantes.mac"

; parametros
%define fondo [ebp + 8]
%define ancho_fondo [ebp + 12]
%define alto_fondo [ebp + 16]
%define primera_columna [ebp + 20]

; modificar si se agregan variables locales
%define bytes_reservados 12

; variables locales
%define p_fila [ebp - 4]
%define p_columna [ebp - 8]
%define p_pantalla [ebp - 12]

extern screen_pixeles
global generarFondo

section .text

generarFondo:

	push ebp			; creo el marco de la pila
	mov ebp, esp			; creo el marco de la pila
	
	sub esp, bytes_reservados	; reservo memoria en la pila

	push ebx			; salvo registros convencion C
	push edi			; salvo registros convencion C
	push esi			; salvo registros convencion C
	
calculo_ancho_fondo_bytes:
	
	mov eax, ancho_fondo
	mov ebx, bytes_por_pixel
	mul ebx				; eax = ancho_fondo_bytes
	mov ecx, eax			; ecx = ancho_fondo_bytes

calculo_resto:

	xor edx, edx
	mov ebx, 4
	div ebx				; eax = ancho_fondo_bytes / 4
					; edx = ancho_fondo_bytes % 4
	cmp edx, 0
	je calcular_bytes_hasta_primer_columna
	
ajustar_ancho_fondo_bytes:

	mov eax, 4
	sub eax, edx			; eax = (4 - resto)
	add ecx, eax			; ancho_fondo_bytes % 4 == 0

calcular_bytes_hasta_primer_columna:

	mov eax, primera_columna
	mov ebx, bytes_por_pixel
	mul ebx				; eax = bytes_hasta_primer_columna
	
inicializar_punteros:

	add eax, fondo			; eax = bytes_hasta_primer_columna + fondo
	mov p_fila, eax			; p_fila = bytes_hasta_primer_columna + fondo
	mov eax, screen_pixeles
	mov eax, [eax]
	mov p_pantalla, eax		; p_pantalla = screen_pixels
	
inicializar_para_cada_fila:

	xor esi, esi			; esi = contador de fila = 0
	
para_cada_fila:

	cmp esi, alto_pantalla		; si esi >= alto_pantalla termino
	jge fin
	mov eax, p_fila
	mov p_columna, eax		; p_columna = p_fila
	
inicializar_para_cada_columna:

	xor edi, edi			; edi = contador de columna = 0
	
para_cada_columna:

	cmp edi, ancho_pantalla
	jge siguiente_fila		; si edi >= ancho_pantalla voy a la siguiente fila
	
	mov eax, p_columna
	mov eax, [eax]
	mov ebx, p_pantalla
	mov dword [ebx], eax
	
	mov eax, p_pantalla
	add eax, bytes_por_pixel
	mov p_pantalla, eax		; avanzo puntero pantalla un pixel
	
	mov eax, p_columna
	add eax, bytes_por_pixel
	mov p_columna, eax		; avanzo puntero columna un pixel
	
siguiente_columna:

	inc edi
	jmp para_cada_columna
	
siguiente_fila:

	inc esi
	add p_fila, ecx			; p_fila+= ancho_fondo_bytes
	
	cmp edx, 0
	jne ajustar_ancho_pantalla_bytes
	jmp para_cada_fila
	
ajustar_ancho_pantalla_bytes:

	mov eax, 4
	sub eax, edx
	add p_fila, eax
	jmp para_cada_fila

fin:

	xor eax, eax

	pop esi				; desarmo el stack frame
	pop edi				; desarmo el stack frame
	pop ebx				; desarmo el stack frame
	
	add esp, bytes_reservados	; desarmo el stack frame
	
	pop ebp				; desarmo el stack frame

	ret
